const app = getApp()

import { upload_api } from "../../common/api/api"
import { bar } from '../../common/static/api_data'
const behavior = require('../relation_behavior')
import { HiddenCall } from '../../request/api.js'
const request = new HiddenCall
import { throttle } from '../../utils/throttle.js'
Component({
  /**
 * 录音上传，录音播放 
 * - @author           王磊
 * bar                      录音动画宽度
 * isVoice                打开录音界面
 * code                   房客编号
 * src                      录音的url
 * voiceModel        录音数组
 * openPrompt      是否执行二次授权
 * play                    是否播放
 * scrolleft              左滑删除移动的距离
 */
  behaviors: [behavior],
  properties: {
    isVoice: {
      type: Boolean,
      value: false
    },
    code: String
  },
  data: {
    src: "",
    voiceModel: [],
    openPrompt: "", 
    bar,
    play: false, 
    scrolleft: 0,
  },
  methods: {
    /**
    * 录音管理器
    * author dzl
    */
    recorder: function () {
      var that = this
      // 获取录音管理
      this.recorderManager = wx.getRecorderManager()
      // 录音开始回调函数
      this.recorderManager.onStart(() => {
      })
      // 录音失败友好提示
      this.recorderManager.onError(() => {
        that.data.src === "" ? that.tip("录音失败！") : ""
      })
      // 开始录音回调函数
      this.recorderManager.onStop((res) => {
        // 录制的时间必须大于1秒
        if (res.duration > 1000) {
          // 获取录音地址，时间
          that.setData({
            src: res.tempFilePath,
            duration: Math.floor(res.duration / 1000),
            time: res.duration
          })
          // 提示用户录音完成
          that.tip("录音完成！")
        }
      })
      // 播放录音管理
      this.innerAudioContext = wx.createInnerAudioContext()
      // 播放录音失败回调函数
      this.innerAudioContext.onError((res) => {
        // 播放失败友好提示
        that.tip("播放录音失败！")
      })
      // 播放录音完毕回调函数
      this.innerAudioContext.onEnded(() => {
        // 停止播放
        that.stopRecord()
      })
    },
    /**
  * 根据初始位置判断用户左滑
  * author wl
  */
    leftMove(e) {
      // 如果滑动的距离小于初始的距离
      if (e.touches[0].pageX < this.data.startPageX) {
        // 时间函数
        let setIntervalTime = setInterval(() => {
          // 左滑动小于250
          if (this.data.scrolleft < 250) {
            // 向左移动以180毫秒50距离左移
            this.data.scrolleft += 50
            // 数据更新
            this.setData({ scrolleft: this.data.scrolleft })
          } else {
            // 如果不小于则删除成功，清空录音地址
            this.setData({ src: "", scrolleft: 0 })
            // 清空时间函数
            clearInterval(setIntervalTime)
          }
        }, 180)
      }
    },
    /**
     * 播放录音
     * author wl
     */
    playReacord() {
      // 播放录音地址
      this.innerAudioContext.src = this.data.src
      // 开始播放
      this.innerAudioContext.play()
      // 打开播放开关
      this.setData({ play: true })
    },
    /**
     * 上传录音
     * author dzl
     */
    uploadVoice: throttle(function() {
      wx.showLoading({ icon: 'loading' })
      // 上传录音
      request.uploadVoice(this.data.src).then(res => {
        // 正则截取录音地址
        let img_name = this.data.src.match(/wxfile\:\/\/(\S*)\.mp3|http\:\/\/tmp\/(\S*)\.durationTime=/)
        // 拼接当前录音地址
        this.data.voiceModel.splice(0, 1, `${upload_api[2].url}/houseHiddenCall/${img_name[1] ? img_name[1] : img_name[2]}duration=${parseInt(this.data.time)}`)
        // 汇集上传数据model
        let model = {
          "resourceCode": this.data.code,
          "urls": this.data.voiceModel,
          "utype": "1002"
        }
        // 进行媒体录音上传
        return request.addMedia(model)
      }).then(res => {
        // 上传成功清空数据数组和录音地址
        this.setData({ voiceModel: [], src: "" })
        wx.hideLoading()
      })
    }, 2000),
    /**
     * 音频录音开始
     * author dzl
     */
    startRecord: function () {
      // 吊起录音授权
      this.vocieAuthorize()
    },
    /**
     * 录音二次打开授权
     * author wl
     */
    opensetting(e) {
      if (e.detail.authSetting['scope.record']) {
        this.setData({ openPrompt: "" })
      }
    },
    /**
     * 录音授权
     * author dzl
     */
    vocieAuthorize() {
      let that = this
      wx.getSetting({
        success(res) {
          // 录音是否授权
          if (!res.authSetting['scope.record']) {
            wx.authorize({
              scope: 'scope.record',
              success() {
                // 授权成功不赋值不进行二次授权
                that.setData({ openPrompt: "" })
              },
              fail() {
                // 授权失败之后，赋值button进行二次授权
                that.setData({ openPrompt: "openSetting" })
              }
            })
          } else {
            // 如果已授权，调用录音函数
            that.recorder()
            // 打开录音动画
            that.setData({ animation: true })
            // 设置录音格式
            that.recorderManager.start({ format: 'mp3' })
          }
        }
      })
    },
    /**
     * 音频录音结束
     * author dzl
     */
    endRecord: function () {
      // 手指松开录音结束
      if (this.recorderManager) {
        // 停止录音
        this.recorderManager.stop()
        // 关闭录音动画
        this.setData({ animation: false })
      }
    },
    /**
     * 获取初始位置
     * author wl
     */
    leftStart(e) {
      // 拿到用户触摸录音获取初始坐标，以便左滑删除
      this.setData({ startPageX: e.touches[0].pageX })
    },
    /**
     * 停止播放
     * author wl
     */
    stopRecord() {
      // 停止播放
      this.innerAudioContext.stop()
      // 关闭播放开关
      this.setData({ play: false })
    },
    /**
     * 录音友好提示
     * author dzl
     */
    tip: function (msg) {
      wx.showModal({
        title: '提示',
        content: msg,
        showCancel: false
      })
    },
    /**
     * 关闭录音界面
     */
    clickMask() {
      this.triggerEvent('clickMask')
    }
  }
})
